這裡是我覺得建網站會卡的坎之一
權限設定如果是內部網站用,就是分登入後可以看到不同的顯示
外部網站用就是會員系統登入是留言板,後面可能寫到,敬請期待~
回到權限設定:註冊/權限設定:登入都是完整的走完以下的流程~
ASP.NET開發操作流程:資料表設定好>再寫程式:加入資料庫>串聯資料庫>產生Models裡面類別檔dao>按:建置>Controllers裡面的Entities>產生畫面View
先說”權限設定:註冊”再說”權限設定:登入”在操作流程上面比較順~
權限設定:註冊
https://laihao2.com/Home/Register
ASP.NET開發操作流程:資料表設定好>再寫程式:加入資料庫>串聯資料庫>產生Models裡面類別檔dao>按:建置>Controllers裡面的Entities>產生畫面View
資料表設定好>再寫程式:加入資料庫>串聯資料庫>
USE [ProductDB]
GO
/****** Object: Table [dbo].[tMember] Script Date: 2024/9/19 下午 10:33:07 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[tMember](
[fId] [int] IDENTITY(1,1) NOT NULL,
[fUserId] [nvarchar](50) NOT NULL,
[fPwd] [nvarchar](50) NOT NULL,
[fName] [nvarchar](50) NOT NULL,
[fEmail] [nvarchar](50) NOT NULL,
[UpdateRight] [nvarchar](1) NULL,
CONSTRAINT [PK_tMember] PRIMARY KEY CLUSTERED
(
[fId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
解釋sql程式碼
這段 SQL 腳本用於在名為 ProductDB
的資料庫中建立一個名為 tMember
的表格。這裡是每個部分的詳細說明:
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
SET ANSI_NULLS ON
:這指示 SQL Server 如何處理 NULL
值的比較。當這個設置為 ON
時,當與 NULL
值進行比較時,= NULL
將不會返回結果,必須使用 IS NULL
。SET QUOTED_IDENTIFIER ON
:這允許使用雙引號來識別對象名稱(如表格和列名),而不是字串文字。tMember
CREATE TABLE [dbo].[tMember](
[fId] [int] IDENTITY(1,1) NOT NULL,
NOT NULL,
NOT NULL,
NOT NULL,
NOT NULL,
NULL,
CONSTRAINT [PK_tMember] PRIMARY KEY CLUSTERED
(
[fId] ASC
)
[dbo].[tMember]
表示該表位於 dbo
架構下,名稱為 tMember
。[fId] [int] IDENTITY(1,1) NOT NULL
:這是自動遞增的整數型主鍵列,IDENTITY(1,1)
表示從 1 開始,每次插入資料時自動增加 1。此列不允許 NULL
值。 NOT NULL
:這是一個長度最多為 50 的 nvarchar
字串,用來儲存用戶的帳號,且此列不允許 NULL
。 NOT NULL
:用來儲存用戶密碼的 nvarchar
字串,長度上限為 50,且不允許 NULL
。 NOT NULL
:用來儲存用戶姓名,長度最多 50,且不允許 NULL
。 NOT NULL
:用來儲存用戶的電子郵件地址,長度最多 50,且不允許 NULL
。 NULL
:這列表示用戶的更新權限,允許 NULL
值,且最大長度為 1。CONSTRAINT [PK_tMember] PRIMARY KEY CLUSTERED
(
[fId] ASC
)
[PK_tMember]
定義了主鍵約束,主鍵是 fId
列,它將確保每個記錄都有一個唯一的 fId
。CLUSTERED
表示主鍵的索引將按照 fId
進行排序。WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
這段是為主鍵索引設定參數:
PAD_INDEX = OFF
:索引填充因子為預設值,表示索引頁面中的空間不會額外填充。STATISTICS_NORECOMPUTE = OFF
:統計資料將在需要時自動更新。IGNORE_DUP_KEY = OFF
:當插入重複鍵值時,會報錯而不是忽略。ALLOW_ROW_LOCKS = ON
和 ALLOW_PAGE_LOCKS = ON
:允許對索引中的行和頁面進行鎖定,以提高並發性能。OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF
:這與高並發插入有關,OFF
表示不啟用此優化。資料表和主鍵索引都建立在 PRIMARY
檔案群組上。
總結:這段 SQL 建立了一個名為 tMember
的資料表,用於儲存會員資料,包括會員的 ID、帳號、密碼、姓名、電子郵件和更新權限。主鍵是 fId
,並為這個表設置了一些索引參數。
注意:識別規則選”是”表示自動遞增
產生Models裡面類別檔dao叫 tMember.cs>按:建置>
這裡可以參考前面幾天~有一步一步講解
解釋程式碼
這段程式碼是用於 ASP.NET MVC 專案中的一個模型類別,代表資料庫中的 tMember
資料表,並使用了 Entity Framework 來進行資料庫操作。這裡是各部分的詳細解釋:
namespace WebApplication5.Models
{
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity.Spatial;
using System.ComponentModel;
WebApplication5.Models
:此類別屬於 WebApplication5
專案的 Models
命名空間,模型類別通常在這個命名空間中定義。System.ComponentModel.DataAnnotations
:這個命名空間提供了屬性(Attributes)用於對模型的屬性進行驗證,如 Required
、StringLength
等。System.ComponentModel.DataAnnotations.Schema
:提供了資料庫映射的功能,如 Table
和 Key
屬性。System.ComponentModel
:提供 DisplayName
等屬性來控制欄位在 UI 上的顯示名稱。[Table("tMember")]
public partial class tMember
[Table("tMember")]
:這個屬性告訴 Entity Framework,這個類別對應到資料庫中的 tMember
表格。public partial class tMember
:這是一個部分類別(partial
),允許類別的其他部分定義在其他檔案中。[Key]
public int fId { get; set; }
[Key]
:這個屬性將 fId
定義為資料表的主鍵,對應到 tMember
資料表的 fId
列。public int fId { get; set; }
:fId
是整數型的自增列。[DisplayName("帳號")]
[Required]
[StringLength(50)]
public string fUserId { get; set; }
[DisplayName("帳號")]
:這個屬性指定在前端顯示該欄位時的名稱為「帳號」。[Required]
:表示這個欄位必須填寫,不能為 null
或空值。[StringLength(50)]
:限制 fUserId
的最大長度為 50 字符,對應資料庫中 nvarchar(50)
的定義。public string fUserId { get; set; }
:用來儲存用戶帳號的屬性,型別是字串。[DisplayName("密碼")]
[Required]
[StringLength(50)]
public string fPwd { get; set; }
[DisplayName("密碼")]
:前端顯示名稱為「密碼」。[Required]
和 [StringLength(50)]
:表示密碼為必填,且長度不能超過 50 個字符。public string fPwd { get; set; }
:用來儲存用戶密碼的屬性。[DisplayName("姓名")]
[Required]
[StringLength(50)]
public string fName { get; set; }
[DisplayName("姓名")]
:顯示名稱為「姓名」。[Required]
和 [StringLength(50)]
:表示姓名欄位必填且長度不能超過 50 字符。public string fName { get; set; }
:用來儲存用戶的姓名。[DisplayName("信箱")]
[Required]
[EmailAddress]
[StringLength(50)]
public string fEmail { get; set; }
[DisplayName("信箱")]
:顯示名稱為「信箱」。[Required]
:表示信箱欄位為必填項。[EmailAddress]
:這個屬性表示該欄位必須符合電子郵件格式。[StringLength(50)]
:限制信箱最大長度為 50 字符。public string fEmail { get; set; }
:用來儲存用戶的電子郵件地址。[StringLength(1)]
public string UpdateRight { get; set; }
[StringLength(1)]
:限制此欄位的長度為 1 個字符。public string UpdateRight { get; set; }
:用來儲存用戶是否擁有更新權限的欄位。這個欄位是可選的,因為沒有加上 Required
屬性。tMember
類別是一個對應資料庫表 tMember
的模型類別。它定義了會員資料表的結構,包含欄位 fId
、fUserId
、fPwd
、fName
、fEmail
和 UpdateRight
,並通過屬性來對這些欄位進行驗證和描述。例如,帳號、密碼、姓名和信箱都是必填項,且信箱必須符合電子郵件格式。要注意在ProductDBContext.cs裡面也有相關程式設定,
這裡就把這個下拉選單會用到相關資料表設定都一起寫上,
後面如果有用到就參考這篇
ProductDBContext程式碼
using System;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Linq;
namespace WebApplication5.Models
{
public partial class ProductDBContext : DbContext
{
public ProductDBContext()
: base("name=ProductDBContext")
{
}
public virtual DbSet<Product> Products { get; set; }
//20240716增加:冷媒欄位
public virtual DbSet<ColdCoal> ColdCoal { get; set; }
//20240716增加:滅火器欄位
public virtual DbSet<FireExtin> FireExtin { get; set; }
//20240716增加:車輛用油欄位
public virtual DbSet<VEHICLE_OIL> VEHICLE_OIL { get; set; }
public virtual DbSet<ELECTRICITY_BILL> ELECTRICITY_BILL { get; set; }
public virtual DbSet<tMember> tMember { get; set; }
public virtual DbSet<GHG_MST_COMMUTE> GHG_MST_COMMUTE { get; set; }
public virtual DbSet<CAT_THREE_EMPLOYEE_COMMUTING> CAT_THREE_EMPLOYEE_COMMUTING { get; set; }
public virtual DbSet<BRM_MST_EMISSION_FACTOR> BRM_MST_EMISSION_FACTOR { get; set; }
public virtual DbSet<TRIP_APPLICATION> TRIP_APPLICATION { get; set; }
public virtual DbSet<TAXI_APPLICATION> TAXI_APPLICATION { get; set; }
public virtual DbSet<HIGH_SPEED_RAIL> HIGH_SPEED_RAIL { get; set; }
public virtual DbSet<EMPLOYEE_TRAVEL_ABROAD> EMPLOYEE_TRAVEL_ABROAD { get; set; }
public virtual DbSet<WATER_BILL> WATER_BILL { get; set; }
public virtual DbSet<WASTES> WASTES { get; set; }
}
}
解釋程式碼
這段 C# 程式碼定義了一個使用 Entity Framework 的資料庫上下文 (DbContext
) 來管理一組資料庫實體 (或稱為資料表) 的映射。程式碼中的每個 DbSet<T>
代表一個資料表,以下是詳細解釋:
ProductDBContext
類別:DbContext
,這是 Entity Framework 中的一個基礎類別,負責與資料庫進行互動。base("name=ProductDBContext")
,指定要使用的資料庫連接字串(ProductDBContext
),這通常在配置檔案(如 Web.config)中定義。DbSet<T>
:DbSet<T>
是 Entity Framework 用來表示資料庫中的表格的。每個 DbSet<T>
對應於一個資料庫表格。DbSet
,每個都代表一個不同的資料表。它們的名稱可以推測出大致用途,例如:
Products
: 代表商品或產品的資料表。ColdCoal
: 代表冷媒(可能是與冷氣或製冷有關)的資料表。FireExtin
: 代表滅火器資料的表格。VEHICLE_OIL
: 代表車輛用油的資料表。ELECTRICITY_BILL
: 代表電費單的資料表。tMember
: 代表成員或用戶的資料表。GHG_MST_COMMUTE
: 可能與溫室氣體排放和員工通勤有關。CAT_THREE_EMPLOYEE_COMMUTING
: 可能與員工通勤的某些分類相關的資料表。BRM_MST_EMISSION_FACTOR
: 可能代表排放因子的主表。TRIP_APPLICATION
: 代表出差申請的資料表。TAXI_APPLICATION
: 代表計程車申請的資料表。HIGH_SPEED_RAIL
: 代表高鐵出行申請的資料表。EMPLOYEE_TRAVEL_ABROAD
: 代表員工出國旅遊申請的資料表。WATER_BILL
: 代表水費單的資料表。WASTES
: 代表廢棄物相關的資料表。//20240716增加:冷媒欄位
:這是用來記錄在 2024 年 7 月 16 日新增的冷媒資料表 (ColdCoal
)。此程式碼負責建立與資料庫的連接,並提供對多個資料表(實體)的 CRUD(創建、讀取、更新、刪除)操作功能。每個 DbSet<T>
都對應一個資料庫表格,允許開發者透過 ProductDBContext
來操作這些表格中的資料。
Controllers裡面的Entities>
//Get:Home/Register
[AllowAnonymous]
public ActionResult Register()
{
return View();
}
//Post:Home/Register
[AllowAnonymous]
[HttpPost]
public ActionResult Register(tMember pMember)
{
//若模型沒有通過驗證則顯示目前的View
if (ModelState.IsValid == false)
{
return View();
}
// 依帳號取得會員並指定給member
var member = _db.tMember
.Where(m => m.fUserId == pMember.fUserId)
.FirstOrDefault();
//若member為null,表示會員未註冊
if (member == null)
{
//將會員記錄新增到tMember資料表
_db.tMember.Add(pMember);
_db.SaveChanges();
//執行Home控制器的Login動作方法
return RedirectToAction("Login");
}
ViewBag.Message = "此帳號己有人使用,註冊失敗";
return View();
}
解釋程式碼
這段程式碼是一個 ASP.NET MVC 的控制器,用於處理用戶註冊流程。分為兩部分:一個 GET
方法和一個 POST
方法。
GET: Home/Register
[AllowAnonymous]
public ActionResult Register()
{
return View();
}
GET
方法。AllowAnonymous
:允許未經身份驗證的用戶訪問這個方法,表示即使用戶沒有登入也可以打開註冊頁面。ActionResult Register()
:這個方法返回一個視圖(View),通常是顯示註冊表單的頁面。POST: Home/Register
[AllowAnonymous]
[HttpPost]
public ActionResult Register(tMember pMember)
{
if (ModelState.IsValid == false)
{
return View();
}
var member = _db.tMember
.Where(m => m.fUserId == pMember.fUserId)
.FirstOrDefault();
if (member == null)
{
_db.tMember.Add(pMember);
_db.SaveChanges();
return RedirectToAction("Login");
}
ViewBag.Message = "此帳號己有人使用,註冊失敗";
return View();
}
AllowAnonymous
和 HttpPost
:允許匿名訪問,並指定這是處理 POST
請求的方法,當用戶提交註冊表單時會執行這個方法。Register(tMember pMember)
:方法的參數 pMember
是一個 tMember
類型的物件,代表提交的註冊數據(如帳號、密碼等)。ModelState.IsValid
:這裡檢查提交的數據是否符合模型驗證規則。如果驗證失敗,返回註冊表單頁面,讓用戶修正輸入。var member = _db.tMember.Where(...)
:這段程式碼從資料庫查詢是否已經存在與提交帳號 (pMember.fUserId
) 相同的會員。如果存在,member
會有值;如果沒有找到對應的會員,member
為 null
。member == null
,表示用戶未註冊過,則將新用戶資料 (pMember
) 新增到資料庫的 tMember
資料表中,並保存更改 (_db.SaveChanges()
)。RedirectToAction("Login")
讓用戶跳轉到登入頁面。ViewBag.Message
顯示一個錯誤訊息「此帳號已有人使用,註冊失敗」,並重新顯示註冊頁面。這段程式碼的主要作用是處理用戶註冊表單的提交,驗證資料並儲存到資料庫,避免重複註冊。
產生畫面View程式碼
@model WebApplication5.Models.tMember
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
@{
ViewBag.Title = "Register";
}
<h2>作品-權限設定</h2>
<h3>註冊後,按登入測試</h3>
<h2>註冊</h2>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(model => model.fUserId, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.fUserId, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.fUserId, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.fPwd, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.fPwd, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.fPwd, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.fName, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.fName, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.fName, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.fEmail, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.fEmail, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.fEmail, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="註冊" class="btn btn-default" />
@ViewBag.Message
</div>
</div>
</div>
}
解釋程式碼
這段程式碼是一個 ASP.NET MVC 應用程式的視圖(View),用來實現用戶註冊表單的功能。它使用 Razor 語法來混合 HTML 和 C# 代碼,並且通過模型 (Model) 來綁定數據。下面是對這段程式碼的解釋:
模型引用與布局設定:
@model WebApplication5.Models.tMember
:指定了這個視圖所綁定的數據模型是 tMember
。這個模型包含註冊表單中的字段,如用戶ID (fUserId
)、密碼 (fPwd
)、姓名 (fName
) 和電子郵件 (fEmail
)。@{ Layout = "~/Views/Shared/_Layout.cshtml"; }
:指定這個視圖的佈局文件,通常佈局文件包含標頭、頁腳等共用部分。頁面標題與視圖包:
@{ ViewBag.Title = "Register"; }
:設定這個頁面的標題為 "Register"。表單開始:
@using (Html.BeginForm())
:這行程式碼創建了一個 HTML <form>
標籤,表單會被提交到當前控制器的操作方法。@Html.AntiForgeryToken()
:加入一個隱藏的防偽令牌,用來防止跨站請求偽造 (CSRF) 攻擊。表單結構:
Html.EditorFor()
來自動生成 HTML <input>
標籤。@Html.LabelFor(model => model.fUserId)
:生成與 fUserId
對應的 <label>
標籤。@Html.EditorFor(model => model.fUserId)
:生成與 fUserId
對應的 <input>
標籤,並使用 form-control
類來進行樣式設置。@Html.ValidationMessageFor(model => model.fUserId)
:生成顯示與 fUserId
相關的錯誤訊息的 <span>
標籤,並應用 text-danger
樣式來顯示紅色文字。每個輸入字段的組合:
tMember
模型的相應屬性。ValidationMessageFor
) 來顯示驗證錯誤。提交按鈕:
<input type="submit" value="註冊" class="btn btn-default" />
:表單的提交按鈕,當用戶點擊後,表單將提交至服務器進行處理。顯示信息:
@ViewBag.Message
:用於顯示來自控制器的消息,可能用於顯示註冊結果(如成功或失敗的提示)。總結:
tMember
綁定各種輸入字段,並實現了基本的表單提交、錯誤驗證和防偽處理。這裡太長,所以登入就明天說~